﻿namespace StockSharp.Algo.Indicators.Trend
{
	using System.ComponentModel;
	using System.Linq;

	/// <summary>
	/// Сглаженное скользящее среднее.
	/// </summary>
	[DisplayName("SMMA")]
	[Description("Сглаженное скользящее среднее.")]
	public class SmoothedMovingAverage : LengthIndicator<decimal>
	{
		/// <summary>
		/// Создать <see cref="SmoothedMovingAverage"/>.
		/// </summary>
		public SmoothedMovingAverage()
			: base(typeof(decimal))
		{
		}

		/// <summary>
		/// Обработать входное значение.
		/// </summary>
		/// <param name="input">Входное значение.</param>
		/// <returns>Результирующее значение.</returns>
		protected override decimal OnProcess(IIndicatorValue input)
		{
			var newValue = input.GetValue<decimal>();

			if (input.IsFinal)
				Buffer.Add(newValue);

			if (!IsFormed)
				return this.GetCurrentValue();

			if (Buffer.Count == Length)
			{
				return  Buffer.Sum() / Length;
			}
			else
			{
				if (input.IsFinal)
					Buffer.RemoveAt(0);
				return (this.GetCurrentValue() * (Length - 1) + newValue) / Length;
			}
		}
	}
}